1 visualization the initial learned BN network

avg.boot.HC <- bnlearn::averaged.network(str_boot_HC, threshold = 0.95)
plot.network(avg.boot.HC, ht = "900px")
plot(str_boot_HC)
abline(v = 0.54, col = "tomato", lty = 2, lwd = 2)
abline(v = 0.70, col = "steelblue", lty = 2, lwd = 2)
abline(v = 0.88, col = "steelblue", lty = 2, lwd = 2)
abline(v = 0.95, col = "orange", lty = 2, lwd = 2)

1.0.1 manipulate the data for visNetwork ploting

outcomes_vars <- c("c_asthma", "w_asthma","trt_copd","noalle_asthma","alle_asthma","any_smp","only_sysmptomps")
#socioeconomic_vars <- colnames(df_all %>% select(matches("IgE_")))
socioeconomic_vars <- c("edu_credits","sei_class","syk_class")
smoking_vars <- c("smoking_status","duration", "startage")
confounders_vars <- c("age","BMI","gender","trt_bp","trt_sleep","trt_diabetes","hereditery_asthma","hereditery_allergy","smoke_expwork")
# get the names of all the variables from the dataframe we used to learn the network
# see the boot_bn_learn r code file
#data_modeling <- mice::complete(loaded_mice_object, 20)
#data_modeling <- Prepare_data_bn(raw_correlated_data = raw_data, imputed_data = data_modeling)
aux_variables <- setdiff(colnames(data_modeling), c(outcomes_vars, socioeconomic_vars, confounders_vars, smoking_vars))

1.0.2 visNetwork plot

# choose a less dense and simpler network
BN_threshold = 0.95
#avg.simpler_mice_hc = averaged.network(str_boot_HC, threshold = BN_threshold)
#avg.simpler_mice_hc = cextend(avg.simpler_mice_hc)
# decide the width of the edges 
# sometimes when the resulted neetwork has issue with cycle ignored then the averaege.network function above will fix it while str.width is not
# this will result in error when creating the network as the edge dataframe will not match
str.width <- str_boot_HC %>% dplyr::filter(strength > BN_threshold & direction >= 0.5)
nodes.uniq <- unique(c(avg.simpler_mice_hc$arcs[,1], avg.simpler_mice_hc$arcs[,2]))
nodes <- data.frame(id = nodes.uniq,
                      label = nodes.uniq,
                      #color = "darkturquoise",
                      shadow = TRUE#, group = c("CL","CO", "O","E","E","CO","CO","E","O","E","E","E","CO","E","E","E","CO","E","E","CO","E","CO"))
)
nodes <- nodes %>% mutate(group = case_when( (label %in% smoking_vars) ~ "Smoking", (label %in% socioeconomic_vars) ~ "SocioEconomic", (label %in% outcomes_vars) ~"Outcomes", (label %in% confounders_vars) ~ "Confounders", (label %in% aux_variables) ~ "auxiliary" ))

#group = c("CL","CO", "O","E","E","CO","CO","E","O","E","E","E","CO","E","E","E","CO","E","E","CO","E","CO","CO","CO")
edges <- data.frame(from = avg.simpler_mice_hc$arcs[,1],
                      to = avg.simpler_mice_hc$arcs[,2],
                      arrows = "to",
                      smooth = TRUE,
                      shadow = TRUE,
                      #width=str.df_all$strength,
                      value=str.width$strength/10,
                      color = "black")
visNetwork(nodes, edges, width = "100%", height = "700px") %>% visIgraphLayout() %>% 
  # darkblue square with shadow for group "A" #visGroups(groupname = "E", color = "darkblue", 
   #         shadow = list(enabled = TRUE)) %>%  red triangle for group "B" visGroups(groupname = "CO", color = "red") %>% # see the visnetwork web page
  visOptions(highlightNearest = list(enabled = T, degree = 1, hover = F), selectedBy = "group",collapse=TRUE) %>% visLayout(randomSeed = 100) %>% visPhysics(stabilization = FALSE) 

1.1 The Bootstraped averaged Network with 95% arc strength

edges <- data.frame(from = avg.simpler_mice_hc$arcs[,1],
                      to = avg.simpler_mice_hc$arcs[,2],
                      arrows = "to",
                      smooth = TRUE,
                      shadow = TRUE,
                      #width=str.df_all$strength,
                      #value=str.width$strength/10,
                      color = "black")
visNetwork(nodes, edges, width = "100%",height = "900px") %>%
  visIgraphLayout() %>%
  visNodes(
    shape = "dot",
    color = list(
      background = "#0085AF",
      border = "#013848",
      highlight = "#FF8000"
    ),
    shadow = list(enabled = TRUE, size = 10)
  ) %>%
  visEdges(
    shadow = FALSE,
    color = list(color = "#0085AF", highlight = "#C62F4B")
  ) %>%
  visOptions(highlightNearest = list(enabled = T, degree = 1, hover = T),
             selectedBy = "group") %>% 
  visLayout(randomSeed = 11)

2 Validating the Bayesian Network

2.1 Cross_validation

tar_load(cv.bn_hc)
cv.bn_hc

  k-fold cross-validation for Bayesian networks

  target network structure:
   [hereditery_asthma][smoking_status][jabstatus|smoking_status]
   [e_amount|smoking_status][startage|smoking_status][sei_class|jabstatus]
   [duration|jabstatus:smoking_status][education|jabstatus:sei_class]
   [trt_bp|jabstatus:education][syk_class|education:sei_class]
   [gender|sei_class:syk_class][trt_sleep|jabstatus:gender:trt_bp]
   [trt_diabetes|trt_bp:trt_sleep][asthma_tm|hereditery_asthma:trt_sleep]
   [hereditery_allergy|hereditery_asthma:education:asthma_tm]
   [any_smp|hereditery_allergy:smoking_status:asthma_tm]
   [herditery_pulldis|hereditery_asthma:asthma_tm:any_smp]
   [DGF_work|gender:syk_class:any_smp][BMI|gender:trt_bp:any_smp]
   [c_asthma|hereditery_asthma:asthma_tm:any_smp][cbc|any_smp]
   [w_asthma|asthma_tm:any_smp][age|jabstatus:trt_bp:BMI]
   [smoke_expwork|DGF_work][her_dis|hereditery_asthma:herditery_pulldis]
   [copd|cbc][only_symptoms|c_asthma:any_smp]
   [noalle_asthma|hereditery_allergy:c_asthma]
   [alle_asthma|hereditery_allergy:c_asthma][smoke_exphome|smoke_expwork]
  number of folds:                       10 
  loss function:                         
                                   Classification Error (Posterior, cond. Gauss.) 
  training node:                         c_asthma 
  number of runs:                        40 
  average loss over the runs:            0.0003323889 
  standard deviation of the loss:        8.268791e-08 

2.2 Original vs Simulated 1

2.3 Original vs Simulated 2

2.4 Original vs Simulated 3

3 Conditional Probability Distributions for effect modification of sei_class var with smoking

3.1 c_asthma with sei_class and smoking_status

effe_modif_vars <- colnames(data_modeling %>% select(sei_class, smoking_status)) 
prop_sei <- cpq_effe_modif(.data = data_modeling, vars = effe_modif_vars, outcome = "c_asthma", state = "1", model = avg.simpler_mice_hc, repeats = 200000)

# Add the names 
prop_sei <- prop_sei %>% mutate(seiClass_new = case_when(sei_class == 0 ~ "Professionals and executives", sei_class == 1 ~ "Manual work in industry", sei_class == 2 ~ "Manual work in service", sei_class == 3 ~ "Assistant Non-manual employees", sei_class == 4 ~ "Intermediate Non-manual employees", sei_class == 5 ~ "Self-employed Non-professionals", sei_class == 6 ~ "students and housewives", sei_class == 7 ~ "unclassified")) %>% mutate(smoking_listNew = case_when(smoking_status == 0 ~ "non_smoker", smoking_status == 1  ~ "formerSmoker", smoking_status == 2  ~ "currentSmoker"))

#library(plotly)
# plot the results
prop_sei_p <- ggplot(prop_sei, aes(x = seiClass_new, y = prob))  + geom_errorbar( aes(ymin = q05, ymax = q975, color = smoking_listNew), position = position_dodge(0.3), width = 0.2) + geom_point(aes(color = smoking_listNew), position = position_dodge(0.3)) + scale_color_manual(values = c("#00AFBB", "#E7B800",'#999999')) + theme_classic() + scale_x_discrete(labels = function(x) {stringr::str_wrap(x, width = 8)})

prop_sei_p

#ggplotly(prop_sei_p)

#subplot(prop_sei_p, prop_sei_p)

3.2 w_asthma with sei_class and smoking_status

effe_modif_vars <- colnames(data_modeling %>% select(sei_class, smoking_status)) 
prop_sei_w <- cpq_effe_modif(.data = data_modeling, vars = effe_modif_vars, outcome = "w_asthma", state = "1", model = avg.simpler_mice_hc, repeats = 200000)

# Add the names 
prop_sei_w <- prop_sei_w %>% mutate(seiClass_new = case_when(sei_class == 0 ~ "Professionals and executives", sei_class == 1 ~ "Manual work in industry", sei_class == 2 ~ "Manual work in service", sei_class == 3 ~ "Assistant Non-manual employees", sei_class == 4 ~ "Intermediate Non-manual employees", sei_class == 5 ~ "Self-employed Non-professionals", sei_class == 6 ~ "students and housewives", sei_class == 7 ~ "unclassified")) %>% mutate(smoking_listNew = case_when(smoking_status == 0 ~ "non_smoker", smoking_status == 1  ~ "formerSmoker", smoking_status == 2  ~ "currentSmoker"))

# plot the results
prop_sei_w_p <- ggplot(prop_sei_w, aes(x = seiClass_new, y = prob))  + geom_errorbar( aes(ymin = q05, ymax = q975, color = smoking_listNew), position = position_dodge(0.3), width = 0.2) + geom_point(aes(color = smoking_listNew), position = position_dodge(0.3)) + scale_color_manual(values = c("#00AFBB", "#E7B800",'#999999')) + theme_classic() + scale_x_discrete(labels = function(x) {stringr::str_wrap(x, width = 8)})

prop_sei_w_p

3.3 any_smp with sei_class and smoking_status

prop_sei_as <- cpq_effe_modif(.data = data_modeling, vars = effe_modif_vars, outcome = "any_smp", state = "1", model = avg.simpler_mice_hc, repeats = 200000)

# Add the names 
prop_sei_as <- prop_sei_as %>% mutate(seiClass_new = case_when(sei_class == 0 ~ "Professionals and executives", sei_class == 1 ~ "Manual work in industry", sei_class == 2 ~ "Manual work in service", sei_class == 3 ~ "Assistant Non-manual employees", sei_class == 4 ~ "Intermediate Non-manual employees", sei_class == 5 ~ "Self-employed Non-professionals", sei_class == 6 ~ "students and housewives", sei_class == 7 ~ "unclassified")) %>% mutate(smoking_listNew = case_when(smoking_status == 0 ~ "non_smoker", smoking_status == 1  ~ "formerSmoker", smoking_status == 2  ~ "currentSmoker"))

# plot the results
prop_sei_as_p <- ggplot(prop_sei_as, aes(x = seiClass_new, y = prob))  + geom_errorbar( aes(ymin = q05, ymax = q975, color = smoking_listNew), position = position_dodge(0.3), width = 0.2) + geom_point(aes(color = smoking_listNew), position = position_dodge(0.3)) + scale_color_manual(values = c("#00AFBB", "#E7B800",'#999999')) + theme_classic() + scale_x_discrete(labels = function(x) {stringr::str_wrap(x, width = 8)})

prop_sei_as_p

3.4 alle_asthma with sei_class and smoking_status

prop_sei_aas <- cpq_effe_modif(.data = data_modeling, vars = effe_modif_vars, outcome = "alle_asthma", state = "1", model = avg.simpler_mice_hc, repeats = 200000)

# Add the names 
prop_sei_aas <- prop_sei_aas %>% mutate(seiClass_new = case_when(sei_class == 0 ~ "Professionals and executives", sei_class == 1 ~ "Manual work in industry", sei_class == 2 ~ "Manual work in service", sei_class == 3 ~ "Assistant Non-manual employees", sei_class == 4 ~ "Intermediate Non-manual employees", sei_class == 5 ~ "Self-employed Non-professionals", sei_class == 6 ~ "students and housewives", sei_class == 7 ~ "unclassified")) %>% mutate(smoking_listNew = case_when(smoking_status == 0 ~ "non_smoker", smoking_status == 1  ~ "formerSmoker", smoking_status == 2  ~ "currentSmoker"))

# plot the results
prop_sei_aas_p <- ggplot(prop_sei_aas, aes(x = seiClass_new, y = prob))  + geom_errorbar( aes(ymin = q05, ymax = q975, color = smoking_listNew), position = position_dodge(0.3), width = 0.2) + geom_point(aes(color = smoking_listNew), position = position_dodge(0.3)) + scale_color_manual(values = c("#00AFBB", "#E7B800",'#999999')) + theme_classic() + scale_x_discrete(labels = function(x) {stringr::str_wrap(x, width = 8)})

prop_sei_aas_p

3.5 noalle_asthma with sei_class and smoking_status

prop_sei_naas <- cpq_effe_modif(.data = data_modeling, vars = effe_modif_vars, outcome = "noalle_asthma", state = "1", model = avg.simpler_mice_hc, repeats = 200000)

# Add the names 
prop_sei_naas <- prop_sei_naas %>% mutate(seiClass_new = case_when(sei_class == 0 ~ "Professionals and executives", sei_class == 1 ~ "Manual work in industry", sei_class == 2 ~ "Manual work in service", sei_class == 3 ~ "Assistant Non-manual employees", sei_class == 4 ~ "Intermediate Non-manual employees", sei_class == 5 ~ "Self-employed Non-professionals", sei_class == 6 ~ "students and housewives", sei_class == 7 ~ "unclassified")) %>% mutate(smoking_listNew = case_when(smoking_status == 0 ~ "non_smoker", smoking_status == 1  ~ "formerSmoker", smoking_status == 2  ~ "currentSmoker"))

# plot the results
prop_sei_naas_p <- ggplot(prop_sei_naas, aes(x = seiClass_new, y = prob))  + geom_errorbar( aes(ymin = q05, ymax = q975, color = smoking_listNew), position = position_dodge(0.3), width = 0.2) + geom_point(aes(color = smoking_listNew), position = position_dodge(0.3)) + scale_color_manual(values = c("#00AFBB", "#E7B800",'#999999')) + theme_classic() + scale_x_discrete(labels = function(x) {stringr::str_wrap(x, width = 8)})

prop_sei_naas_p

4 Conditional Probability Distributions for effect modification of education var with smoking

4.1 c_asthma with education and smoking_status

effe_modif_vars_edu <- colnames(data_modeling %>% select(education, smoking_status)) 
# get the cp
prop_edu <- cpq_effe_modif(.data = data_modeling, vars = effe_modif_vars_edu, outcome = "c_asthma", state = "1", model = avg.simpler_mice_hc, repeats = 200000)
# get the plot
prop_edu_p <- get_cpq_plot(res_data = prop_edu, effe_modif_vars = effe_modif_vars_edu, original_raw_data = as.data.frame(raw_data), final_data = data_modeling)

prop_edu_p[[2]]

4.2 w_asthma with education and smoking_status

prop_edu_w <- cpq_effe_modif(.data = data_modeling, vars = effe_modif_vars_edu, outcome = "w_asthma", state = "1", model = avg.simpler_mice_hc, repeats = 200000)
# get the plot
prop_edu_w_p <- get_cpq_plot(res_data = prop_edu_w, effe_modif_vars = effe_modif_vars_edu, original_raw_data = as.data.frame(raw_data), final_data = data_modeling)
prop_edu_w_p[[2]]

4.3 any_smp with education and smoking_status

prop_edu_as <- cpq_effe_modif(.data = data_modeling, vars = effe_modif_vars_edu, outcome = "any_smp", state = "1", model = avg.simpler_mice_hc, repeats = 200000)
# get the plot
prop_syk_as_p <- get_cpq_plot(res_data = prop_edu_as, effe_modif_vars = effe_modif_vars_edu, original_raw_data = as.data.frame(raw_data), final_data = data_modeling)
prop_syk_as_p[[2]]

4.4 alle_asthma with education and smoking_status

prop_edu_aas <- cpq_effe_modif(.data = data_modeling, vars = effe_modif_vars_edu, outcome = "alle_asthma", state = "1", model = avg.simpler_mice_hc, repeats = 200000)
prop_edu_aas_p <- get_cpq_plot(res_data = prop_edu_aas, effe_modif_vars = effe_modif_vars_edu, original_raw_data = as.data.frame(raw_data), final_data = data_modeling)
prop_edu_aas_p[[2]]

4.5 noalle_asthma with education and smoking_status

prop_edu_naas <- cpq_effe_modif(.data = data_modeling, vars = effe_modif_vars_edu, outcome = "noalle_asthma", state = "1", model = avg.simpler_mice_hc, repeats = 200000)
prop_edu_naas_p <- get_cpq_plot(res_data = prop_edu_naas, effe_modif_vars = effe_modif_vars_edu, original_raw_data = as.data.frame(raw_data), final_data = data_modeling)
prop_edu_naas_p[[2]]

5 Conditional Probability Distributions for effect modification of syk_class var with smoking

5.1 c_asthma with syk_class and smoking_status

effe_modif_vars_syk <- colnames(data_modeling %>% select(syk_class, smoking_status)) 
# get the cp
prop_syk <- cpq_effe_modif(.data = data_modeling, vars = effe_modif_vars_syk, outcome = "c_asthma", state = "1", model = avg.simpler_mice_hc, repeats = 200000)
# get the plot
prop_syk_p <- get_cpq_plot(res_data = prop_syk, effe_modif_vars = effe_modif_vars_syk, original_raw_data = as.data.frame(raw_data), final_data = data_modeling)

prop_syk_p[[2]]

5.2 w_asthma with syk_class and smoking_status

prop_syk_w <- cpq_effe_modif(.data = data_modeling, vars = effe_modif_vars_syk, outcome = "w_asthma", state = "1", model = avg.simpler_mice_hc, repeats = 200000)
# get the plot
prop_syk_w_p <- get_cpq_plot(res_data = prop_syk_w, effe_modif_vars = effe_modif_vars_syk, original_raw_data = as.data.frame(raw_data), final_data = data_modeling)
prop_syk_w_p[[2]]

5.3 any_smp with syk_class and smoking_status

prop_syk_as <- cpq_effe_modif(.data = data_modeling, vars = effe_modif_vars_syk, outcome = "any_smp", state = "1", model = avg.simpler_mice_hc, repeats = 200000)
# get the plot
prop_syk_as_p <- get_cpq_plot(res_data = prop_syk_as, effe_modif_vars = effe_modif_vars_syk, original_raw_data = as.data.frame(raw_data), final_data = data_modeling)
prop_syk_as_p[[2]]

5.4 alle_asthma with syk_class and smoking_status

prop_syk_aas <- cpq_effe_modif(.data = data_modeling, vars = effe_modif_vars_syk, outcome = "alle_asthma", state = "1", model = avg.simpler_mice_hc, repeats = 200000)
prop_syk_aas_p <- get_cpq_plot(res_data = prop_syk_aas, effe_modif_vars = effe_modif_vars_syk, original_raw_data = as.data.frame(raw_data), final_data = data_modeling)
prop_syk_aas_p[[2]]

5.5 noalle_asthma with syk_class and smoking_status

prop_syk_naas <- cpq_effe_modif(.data = data_modeling, vars = effe_modif_vars_syk, outcome = "noalle_asthma", state = "1", model = avg.simpler_mice_hc, repeats = 200000)
prop_syk_naas_p <- get_cpq_plot(res_data = prop_syk_naas, effe_modif_vars = effe_modif_vars_syk, original_raw_data = as.data.frame(raw_data), final_data = data_modeling)
prop_syk_naas_p[[2]]

LS0tCnRpdGxlOiAiQmF5ZXNpYW4gQW5hbHlzaXMgZm9yIHRoZSBzZWNpb2Vjb25pbWljIG1vZGlmaWNhYXRpb24gZWZmZWN0IHN0dWR5IgphdXRob3I6IFJhbmkgQmFzbmEKZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJWQgJUIsICVZJylgIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRoZW1lOiB1bml0ZWQKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIHRvYzogdHJ1ZQogICAgdG9jX2RlcHRoOiAzCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQotLS0KCmBgYHtyIGxpYnJhcmllcywgZWNobz1GQUxTRX0KbGlicmFyeSh0YXJnZXRzKQpgYGAKCmBgYHtyIGxvYWRpbmcsIGVjaG89RkFMU0V9CiN0YXJfbG9hZChsZWFybl9ibl9zdHJ1Y3R1cmUpCnRhcl9sb2FkKHN0cl9ib290X0hDKQojIGxvYWQgdGhlIHJhdyBkYXRhIGFuZCB0aGUgbGVhcm5lZCBtaWNlIG9iamVjdAp0YXJfbG9hZChsb2FkZWRfbWljZV9vYmplY3QpCnRhcl9sb2FkKHJhd19kYXRhKQp0YXJfbG9hZChkYXRhX21vZGVsaW5nKQp0YXJfbG9hZChhdmcuc2ltcGxlcl9taWNlX2hjKQpgYGAKCiMgdmlzdWFsaXphdGlvbiB0aGUgaW5pdGlhbCBsZWFybmVkIEJOIG5ldHdvcmsKCmBgYHtyIGF2ZXJhZ0JOfQphdmcuYm9vdC5IQyA8LSBibmxlYXJuOjphdmVyYWdlZC5uZXR3b3JrKHN0cl9ib290X0hDLCB0aHJlc2hvbGQgPSAwLjk1KQpwbG90Lm5ldHdvcmsoYXZnLmJvb3QuSEMsIGh0ID0gIjkwMHB4IikKYGBgCgoKYGBge3IgYm9vdHN0cmFwfQpwbG90KHN0cl9ib290X0hDKQphYmxpbmUodiA9IDAuNTQsIGNvbCA9ICJ0b21hdG8iLCBsdHkgPSAyLCBsd2QgPSAyKQphYmxpbmUodiA9IDAuNzAsIGNvbCA9ICJzdGVlbGJsdWUiLCBsdHkgPSAyLCBsd2QgPSAyKQphYmxpbmUodiA9IDAuODgsIGNvbCA9ICJzdGVlbGJsdWUiLCBsdHkgPSAyLCBsd2QgPSAyKQphYmxpbmUodiA9IDAuOTUsIGNvbCA9ICJvcmFuZ2UiLCBsdHkgPSAyLCBsd2QgPSAyKQpgYGAKCiMjIyBtYW5pcHVsYXRlIHRoZSBkYXRhIGZvciB2aXNOZXR3b3JrIHBsb3RpbmcKYGBge3IgVmFyUm9sc30Kb3V0Y29tZXNfdmFycyA8LSBjKCJjX2FzdGhtYSIsICJ3X2FzdGhtYSIsInRydF9jb3BkIiwibm9hbGxlX2FzdGhtYSIsImFsbGVfYXN0aG1hIiwiYW55X3NtcCIsIm9ubHlfc3lzbXB0b21wcyIpCiNzb2Npb2Vjb25vbWljX3ZhcnMgPC0gY29sbmFtZXMoZGZfYWxsICU+JSBzZWxlY3QobWF0Y2hlcygiSWdFXyIpKSkKc29jaW9lY29ub21pY192YXJzIDwtIGMoImVkdV9jcmVkaXRzIiwic2VpX2NsYXNzIiwic3lrX2NsYXNzIikKc21va2luZ192YXJzIDwtIGMoInNtb2tpbmdfc3RhdHVzIiwiZHVyYXRpb24iLCAic3RhcnRhZ2UiKQpjb25mb3VuZGVyc192YXJzIDwtIGMoImFnZSIsIkJNSSIsImdlbmRlciIsInRydF9icCIsInRydF9zbGVlcCIsInRydF9kaWFiZXRlcyIsImhlcmVkaXRlcnlfYXN0aG1hIiwiaGVyZWRpdGVyeV9hbGxlcmd5Iiwic21va2VfZXhwd29yayIpCiMgZ2V0IHRoZSBuYW1lcyBvZiBhbGwgdGhlIHZhcmlhYmxlcyBmcm9tIHRoZSBkYXRhZnJhbWUgd2UgdXNlZCB0byBsZWFybiB0aGUgbmV0d29yawojIHNlZSB0aGUgYm9vdF9ibl9sZWFybiByIGNvZGUgZmlsZQojZGF0YV9tb2RlbGluZyA8LSBtaWNlOjpjb21wbGV0ZShsb2FkZWRfbWljZV9vYmplY3QsIDIwKQojZGF0YV9tb2RlbGluZyA8LSBQcmVwYXJlX2RhdGFfYm4ocmF3X2NvcnJlbGF0ZWRfZGF0YSA9IHJhd19kYXRhLCBpbXB1dGVkX2RhdGEgPSBkYXRhX21vZGVsaW5nKQphdXhfdmFyaWFibGVzIDwtIHNldGRpZmYoY29sbmFtZXMoZGF0YV9tb2RlbGluZyksIGMob3V0Y29tZXNfdmFycywgc29jaW9lY29ub21pY192YXJzLCBjb25mb3VuZGVyc192YXJzLCBzbW9raW5nX3ZhcnMpKQpgYGAKCiMjIyB2aXNOZXR3b3JrIHBsb3QKCmBgYHtyIFZpc05ldFByZXBhcmV9CiMgY2hvb3NlIGEgbGVzcyBkZW5zZSBhbmQgc2ltcGxlciBuZXR3b3JrCkJOX3RocmVzaG9sZCA9IDAuOTUKI2F2Zy5zaW1wbGVyX21pY2VfaGMgPSBhdmVyYWdlZC5uZXR3b3JrKHN0cl9ib290X0hDLCB0aHJlc2hvbGQgPSBCTl90aHJlc2hvbGQpCiNhdmcuc2ltcGxlcl9taWNlX2hjID0gY2V4dGVuZChhdmcuc2ltcGxlcl9taWNlX2hjKQojIGRlY2lkZSB0aGUgd2lkdGggb2YgdGhlIGVkZ2VzIAojIHNvbWV0aW1lcyB3aGVuIHRoZSByZXN1bHRlZCBuZWV0d29yayBoYXMgaXNzdWUgd2l0aCBjeWNsZSBpZ25vcmVkIHRoZW4gdGhlIGF2ZXJhZWdlLm5ldHdvcmsgZnVuY3Rpb24gYWJvdmUgd2lsbCBmaXggaXQgd2hpbGUgc3RyLndpZHRoIGlzIG5vdAojIHRoaXMgd2lsbCByZXN1bHQgaW4gZXJyb3Igd2hlbiBjcmVhdGluZyB0aGUgbmV0d29yayBhcyB0aGUgZWRnZSBkYXRhZnJhbWUgd2lsbCBub3QgbWF0Y2gKc3RyLndpZHRoIDwtIHN0cl9ib290X0hDICU+JSBkcGx5cjo6ZmlsdGVyKHN0cmVuZ3RoID4gQk5fdGhyZXNob2xkICYgZGlyZWN0aW9uID49IDAuNSkKbm9kZXMudW5pcSA8LSB1bmlxdWUoYyhhdmcuc2ltcGxlcl9taWNlX2hjJGFyY3NbLDFdLCBhdmcuc2ltcGxlcl9taWNlX2hjJGFyY3NbLDJdKSkKbm9kZXMgPC0gZGF0YS5mcmFtZShpZCA9IG5vZGVzLnVuaXEsCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IG5vZGVzLnVuaXEsCiAgICAgICAgICAgICAgICAgICAgICAjY29sb3IgPSAiZGFya3R1cnF1b2lzZSIsCiAgICAgICAgICAgICAgICAgICAgICBzaGFkb3cgPSBUUlVFIywgZ3JvdXAgPSBjKCJDTCIsIkNPIiwgIk8iLCJFIiwiRSIsIkNPIiwiQ08iLCJFIiwiTyIsIkUiLCJFIiwiRSIsIkNPIiwiRSIsIkUiLCJFIiwiQ08iLCJFIiwiRSIsIkNPIiwiRSIsIkNPIikpCikKbm9kZXMgPC0gbm9kZXMgJT4lIG11dGF0ZShncm91cCA9IGNhc2Vfd2hlbiggKGxhYmVsICVpbiUgc21va2luZ192YXJzKSB+ICJTbW9raW5nIiwgKGxhYmVsICVpbiUgc29jaW9lY29ub21pY192YXJzKSB+ICJTb2Npb0Vjb25vbWljIiwgKGxhYmVsICVpbiUgb3V0Y29tZXNfdmFycykgfiJPdXRjb21lcyIsIChsYWJlbCAlaW4lIGNvbmZvdW5kZXJzX3ZhcnMpIH4gIkNvbmZvdW5kZXJzIiwgKGxhYmVsICVpbiUgYXV4X3ZhcmlhYmxlcykgfiAiYXV4aWxpYXJ5IiApKQoKI2dyb3VwID0gYygiQ0wiLCJDTyIsICJPIiwiRSIsIkUiLCJDTyIsIkNPIiwiRSIsIk8iLCJFIiwiRSIsIkUiLCJDTyIsIkUiLCJFIiwiRSIsIkNPIiwiRSIsIkUiLCJDTyIsIkUiLCJDTyIsIkNPIiwiQ08iKQplZGdlcyA8LSBkYXRhLmZyYW1lKGZyb20gPSBhdmcuc2ltcGxlcl9taWNlX2hjJGFyY3NbLDFdLAogICAgICAgICAgICAgICAgICAgICAgdG8gPSBhdmcuc2ltcGxlcl9taWNlX2hjJGFyY3NbLDJdLAogICAgICAgICAgICAgICAgICAgICAgYXJyb3dzID0gInRvIiwKICAgICAgICAgICAgICAgICAgICAgIHNtb290aCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBzaGFkb3cgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgI3dpZHRoPXN0ci5kZl9hbGwkc3RyZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1zdHIud2lkdGgkc3RyZW5ndGgvMTAsCiAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIpCgpgYGAKCmBgYHtyIFZpc05ldDEsIGV2YWw9RkFMU0V9CnZpc05ldHdvcmsobm9kZXMsIGVkZ2VzLCB3aWR0aCA9ICIxMDAlIiwgaGVpZ2h0ID0gIjcwMHB4IikgJT4lIHZpc0lncmFwaExheW91dCgpICU+JSAKICAjIGRhcmtibHVlIHNxdWFyZSB3aXRoIHNoYWRvdyBmb3IgZ3JvdXAgIkEiICN2aXNHcm91cHMoZ3JvdXBuYW1lID0gIkUiLCBjb2xvciA9ICJkYXJrYmx1ZSIsIAogICAjICAgICAgICAgc2hhZG93ID0gbGlzdChlbmFibGVkID0gVFJVRSkpICU+JSAgcmVkIHRyaWFuZ2xlIGZvciBncm91cCAiQiIgdmlzR3JvdXBzKGdyb3VwbmFtZSA9ICJDTyIsIGNvbG9yID0gInJlZCIpICU+JSAjIHNlZSB0aGUgdmlzbmV0d29yayB3ZWIgcGFnZQogIHZpc09wdGlvbnMoaGlnaGxpZ2h0TmVhcmVzdCA9IGxpc3QoZW5hYmxlZCA9IFQsIGRlZ3JlZSA9IDEsIGhvdmVyID0gRiksIHNlbGVjdGVkQnkgPSAiZ3JvdXAiLGNvbGxhcHNlPVRSVUUpICU+JSB2aXNMYXlvdXQocmFuZG9tU2VlZCA9IDEwMCkgJT4lIHZpc1BoeXNpY3Moc3RhYmlsaXphdGlvbiA9IEZBTFNFKSAKYGBgCgojIyBUaGUgQm9vdHN0cmFwZWQgYXZlcmFnZWQgTmV0d29yayB3aXRoIDk1JSBhcmMgc3RyZW5ndGgKCmBgYHtyIFZpc05ldDJ9CmVkZ2VzIDwtIGRhdGEuZnJhbWUoZnJvbSA9IGF2Zy5zaW1wbGVyX21pY2VfaGMkYXJjc1ssMV0sCiAgICAgICAgICAgICAgICAgICAgICB0byA9IGF2Zy5zaW1wbGVyX21pY2VfaGMkYXJjc1ssMl0sCiAgICAgICAgICAgICAgICAgICAgICBhcnJvd3MgPSAidG8iLAogICAgICAgICAgICAgICAgICAgICAgc21vb3RoID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgIHNoYWRvdyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAjd2lkdGg9c3RyLmRmX2FsbCRzdHJlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICN2YWx1ZT1zdHIud2lkdGgkc3RyZW5ndGgvMTAsCiAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIpCnZpc05ldHdvcmsobm9kZXMsIGVkZ2VzLCB3aWR0aCA9ICIxMDAlIixoZWlnaHQgPSAiOTAwcHgiKSAlPiUKICB2aXNJZ3JhcGhMYXlvdXQoKSAlPiUKICB2aXNOb2RlcygKICAgIHNoYXBlID0gImRvdCIsCiAgICBjb2xvciA9IGxpc3QoCiAgICAgIGJhY2tncm91bmQgPSAiIzAwODVBRiIsCiAgICAgIGJvcmRlciA9ICIjMDEzODQ4IiwKICAgICAgaGlnaGxpZ2h0ID0gIiNGRjgwMDAiCiAgICApLAogICAgc2hhZG93ID0gbGlzdChlbmFibGVkID0gVFJVRSwgc2l6ZSA9IDEwKQogICkgJT4lCiAgdmlzRWRnZXMoCiAgICBzaGFkb3cgPSBGQUxTRSwKICAgIGNvbG9yID0gbGlzdChjb2xvciA9ICIjMDA4NUFGIiwgaGlnaGxpZ2h0ID0gIiNDNjJGNEIiKQogICkgJT4lCiAgdmlzT3B0aW9ucyhoaWdobGlnaHROZWFyZXN0ID0gbGlzdChlbmFibGVkID0gVCwgZGVncmVlID0gMSwgaG92ZXIgPSBUKSwKICAgICAgICAgICAgIHNlbGVjdGVkQnkgPSAiZ3JvdXAiKSAlPiUgCiAgdmlzTGF5b3V0KHJhbmRvbVNlZWQgPSAxMSkKYGBgCgoKIyBWYWxpZGF0aW5nIHRoZSBCYXllc2lhbiBOZXR3b3JrIHsudGFic2V0fQoKYGBge3IgZGlzY3JldGl6ZWFWYXJzLCBlY2hvPUZBTFNFLCBldmFsPUZBTFNFfQpkaXNfZGF0YSA8LSBibmxlYXJuOjpkaXNjcmV0aXplKGRhdGEgPSBkYXRhX21vZGVsaW5nICU+JSBzZWxlY3QoZHVyYXRpb24sIHN0YXJ0YWdlKSwgbWV0aG9kID0gImhhcnRlbWluayIsIGJyZWFrcyA9IDcsIG9yZGVyZWQgPSBGQUxTRSwgaWJyZWFrcz02MCwgaWRpc2M9InF1YW50aWxlIikKZGF0YV9tb2RlbGluZyA8LSBkYXRhX21vZGVsaW5nICU+JSBkcGx5cjo6c2VsZWN0KC1jKCBkdXJhdGlvbiwgc3RhcnRhZ2UpKSAlPiUgY2JpbmQoZGlzX2RhdGEpIAojZml0dGVkLnNpbXBsZXJfbWljZV9oY19kaXNfMiA9IGJuLmZpdChjZXh0ZW5kKGF2Zy5zaW1wbGVyX21pY2VfaGMpLCBkYXRhX21vZGVsaW5nKQpgYGAKCiMjIENyb3NzX3ZhbGlkYXRpb24KCmBgYHtyIENyb3NzVmFsaWRhdGlvbiwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KdGFyX2xvYWQoY3YuYm5faGMpCmN2LmJuX2hjCmBgYAoKCmBgYHtyIHNpbXVsYXRpb24sIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGNhY2hlPVRSVUV9CiMgZml0IHRoZSBCTgpmaXR0ZWQuc2ltcGxlcl9taWNlX2hjID0gYm4uZml0KGNleHRlbmQoYXZnLnNpbXBsZXJfbWljZV9oYyksIGRhdGFfbW9kZWxpbmcpCgphaXNfc3ViID0gZGF0YV9tb2RlbGluZwoKIyBjb21wYXJlIHRoZSBzeW50aGV0aWMgYW5kIG9yaWdpbmFsIGRhdGEgZnJhbWVzCmRmIDwtIGFpc19zdWIgJT4lIAogIG11dGF0ZSh0eXBlID0gIm9yaWciKSAlPiUgCiAgYmluZF9yb3dzKAogICAgcmJuKGZpdHRlZC5zaW1wbGVyX21pY2VfaGMsIDMwMDAwKSAlPiUgCiAgICAgIG11dGF0ZSh0eXBlID0gInNpbSIpCiAgICApICMgJT4lIApnZ19saXN0IDwtIGxpc3QoKQpncnBfdmFyIDwtICJ0eXBlIgp2YXJzIDwtIGNvbG5hbWVzKGRmKVtjb2xuYW1lcyhkZikgIT0gZ3JwX3Zhcl0KZm9yKGsgaW4gMTpsZW5ndGgodmFycykpewogIHZhcl9rIDwtIHZhcnNba10KICBnZ19saXN0W1trXV0gPC0gZ2dwbG90KGRmLCBhZXNfc3RyaW5nKHggPSB2YXJfaywgZmlsbCA9IGdycF92YXIsIGNvbCA9IGdycF92YXIpKQogIGlmKGlzLm51bWVyaWMoZGZbW3Zhcl9rXV0pKXsKICAgIGdnX2xpc3RbW2tdXSA8LSBnZ19saXN0W1trXV0gKyBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjg1LCBzaXplID0gMCkKICB9ZWxzZXsKICAgIGdnX2xpc3RbW2tdXSA8LSBnZ19saXN0W1trXV0gKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIpCiAgfQogIGdnX2xpc3RbW2tdXSA8LSBnZ19saXN0W1trXV0gKyAKICAgIHRoZW1lKAogICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSwKICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpCiAgICApICsKICAgIGxhYnModGl0bGUgPSB2YXJfaykKfQoKYGBgCgpgYGB7ciwgZmlndXJlcy1zaWRlLCBmaWcuc2hvdz0iaG9sZCIsIG91dC53aWR0aD0iNTAlIiwgZXZhbD1GQUxTRSwgZWNobz1GQUxTRX0KbGVuZ3RoKGdnX2xpc3QpCmdnX2xpc3QKYGBgCgojIyBPcmlnaW5hbCB2cyBTaW11bGF0ZWQgMQoKYGBge3IgT3JWc1NpbTEsIGVjaG89RkFMU0UsIGNhY2hlPVRSVUV9CnBsb3RfZ3JpZChnZ19saXN0W1sxXV0sIGdnX2xpc3RbWzJdXSwgZ2dfbGlzdFtbM11dLCBnZ19saXN0W1s0XV0sIGdnX2xpc3RbWzVdXSwgZ2dfbGlzdFtbNl1dLCBucm93ID0gMiwgbmNvbCA9IDMpCmBgYAoKIyMgT3JpZ2luYWwgdnMgU2ltdWxhdGVkIDIKCmBgYHtyIE9yVnNTaW0yLCBlY2hvPUZBTFNFLCBjYWNoZT1UUlVFfQpwbG90X2dyaWQoZ2dfbGlzdFtbN11dLCBnZ19saXN0W1s4XV0sIGdnX2xpc3RbWzldXSwgZ2dfbGlzdFtbMTBdXSwgZ2dfbGlzdFtbMTFdXSwgZ2dfbGlzdFtbMTJdXSwgbnJvdyA9IDIsIG5jb2wgPSAzKQpgYGAKCgojIyBPcmlnaW5hbCB2cyBTaW11bGF0ZWQgMwoKYGBge3IgT3JWc1NpbTQsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGNhY2hlPVRSVUV9CnBsb3RfZ3JpZChnZ19saXN0W1sxOV1dLCBnZ19saXN0W1syMF1dLCBnZ19saXN0W1syMV1dLCBnZ19saXN0W1syMl1dLGdnX2xpc3RbWzIzXV0sZ2dfbGlzdFtbMjRdXSwgbnJvdyA9IDIsIG5jb2wgPSAzKQpgYGAKCgojIENvbmRpdGlvbmFsIFByb2JhYmlsaXR5IERpc3RyaWJ1dGlvbnMgZm9yIGVmZmVjdCBtb2RpZmljYXRpb24gb2Ygc2VpX2NsYXNzIHZhciB3aXRoIHNtb2tpbmcgey50YWJzZXR9CgojIyBjX2FzdGhtYSB3aXRoIHNlaV9jbGFzcyBhbmQgc21va2luZ19zdGF0dXMgCmBgYHtyIGNwcXVlcnlfdGFibGVfdywgY2FjaGU9VFJVRX0KZWZmZV9tb2RpZl92YXJzIDwtIGNvbG5hbWVzKGRhdGFfbW9kZWxpbmcgJT4lIHNlbGVjdChzZWlfY2xhc3MsIHNtb2tpbmdfc3RhdHVzKSkgCnByb3Bfc2VpIDwtIGNwcV9lZmZlX21vZGlmKC5kYXRhID0gZGF0YV9tb2RlbGluZywgdmFycyA9IGVmZmVfbW9kaWZfdmFycywgb3V0Y29tZSA9ICJjX2FzdGhtYSIsIHN0YXRlID0gIjEiLCBtb2RlbCA9IGF2Zy5zaW1wbGVyX21pY2VfaGMsIHJlcGVhdHMgPSAyMDAwMDApCgojIEFkZCB0aGUgbmFtZXMgCnByb3Bfc2VpIDwtIHByb3Bfc2VpICU+JSBtdXRhdGUoc2VpQ2xhc3NfbmV3ID0gY2FzZV93aGVuKHNlaV9jbGFzcyA9PSAwIH4gIlByb2Zlc3Npb25hbHMgYW5kIGV4ZWN1dGl2ZXMiLCBzZWlfY2xhc3MgPT0gMSB+ICJNYW51YWwgd29yayBpbiBpbmR1c3RyeSIsIHNlaV9jbGFzcyA9PSAyIH4gIk1hbnVhbCB3b3JrIGluIHNlcnZpY2UiLCBzZWlfY2xhc3MgPT0gMyB+ICJBc3Npc3RhbnQgTm9uLW1hbnVhbCBlbXBsb3llZXMiLCBzZWlfY2xhc3MgPT0gNCB+ICJJbnRlcm1lZGlhdGUgTm9uLW1hbnVhbCBlbXBsb3llZXMiLCBzZWlfY2xhc3MgPT0gNSB+ICJTZWxmLWVtcGxveWVkIE5vbi1wcm9mZXNzaW9uYWxzIiwgc2VpX2NsYXNzID09IDYgfiAic3R1ZGVudHMgYW5kIGhvdXNld2l2ZXMiLCBzZWlfY2xhc3MgPT0gNyB+ICJ1bmNsYXNzaWZpZWQiKSkgJT4lIG11dGF0ZShzbW9raW5nX2xpc3ROZXcgPSBjYXNlX3doZW4oc21va2luZ19zdGF0dXMgPT0gMCB+ICJub25fc21va2VyIiwgc21va2luZ19zdGF0dXMgPT0gMSAgfiAiZm9ybWVyU21va2VyIiwgc21va2luZ19zdGF0dXMgPT0gMiAgfiAiY3VycmVudFNtb2tlciIpKQoKI2xpYnJhcnkocGxvdGx5KQojIHBsb3QgdGhlIHJlc3VsdHMKcHJvcF9zZWlfcCA8LSBnZ3Bsb3QocHJvcF9zZWksIGFlcyh4ID0gc2VpQ2xhc3NfbmV3LCB5ID0gcHJvYikpICArIGdlb21fZXJyb3JiYXIoIGFlcyh5bWluID0gcTA1LCB5bWF4ID0gcTk3NSwgY29sb3IgPSBzbW9raW5nX2xpc3ROZXcpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuMyksIHdpZHRoID0gMC4yKSArIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gc21va2luZ19saXN0TmV3KSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjMpKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMDBBRkJCIiwgIiNFN0I4MDAiLCcjOTk5OTk5JykpICsgdGhlbWVfY2xhc3NpYygpICsgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSB7c3RyaW5ncjo6c3RyX3dyYXAoeCwgd2lkdGggPSA4KX0pCgpwcm9wX3NlaV9wCiNnZ3Bsb3RseShwcm9wX3NlaV9wKQoKI3N1YnBsb3QocHJvcF9zZWlfcCwgcHJvcF9zZWlfcCkKYGBgCgojIyB3X2FzdGhtYSB3aXRoIHNlaV9jbGFzcyBhbmQgc21va2luZ19zdGF0dXMgCmBgYHtyIGNwcXVlcnlfdGFibGUsIGNhY2hlPVRSVUV9CmVmZmVfbW9kaWZfdmFycyA8LSBjb2xuYW1lcyhkYXRhX21vZGVsaW5nICU+JSBzZWxlY3Qoc2VpX2NsYXNzLCBzbW9raW5nX3N0YXR1cykpIApwcm9wX3NlaV93IDwtIGNwcV9lZmZlX21vZGlmKC5kYXRhID0gZGF0YV9tb2RlbGluZywgdmFycyA9IGVmZmVfbW9kaWZfdmFycywgb3V0Y29tZSA9ICJ3X2FzdGhtYSIsIHN0YXRlID0gIjEiLCBtb2RlbCA9IGF2Zy5zaW1wbGVyX21pY2VfaGMsIHJlcGVhdHMgPSAyMDAwMDApCgojIEFkZCB0aGUgbmFtZXMgCnByb3Bfc2VpX3cgPC0gcHJvcF9zZWlfdyAlPiUgbXV0YXRlKHNlaUNsYXNzX25ldyA9IGNhc2Vfd2hlbihzZWlfY2xhc3MgPT0gMCB+ICJQcm9mZXNzaW9uYWxzIGFuZCBleGVjdXRpdmVzIiwgc2VpX2NsYXNzID09IDEgfiAiTWFudWFsIHdvcmsgaW4gaW5kdXN0cnkiLCBzZWlfY2xhc3MgPT0gMiB+ICJNYW51YWwgd29yayBpbiBzZXJ2aWNlIiwgc2VpX2NsYXNzID09IDMgfiAiQXNzaXN0YW50IE5vbi1tYW51YWwgZW1wbG95ZWVzIiwgc2VpX2NsYXNzID09IDQgfiAiSW50ZXJtZWRpYXRlIE5vbi1tYW51YWwgZW1wbG95ZWVzIiwgc2VpX2NsYXNzID09IDUgfiAiU2VsZi1lbXBsb3llZCBOb24tcHJvZmVzc2lvbmFscyIsIHNlaV9jbGFzcyA9PSA2IH4gInN0dWRlbnRzIGFuZCBob3VzZXdpdmVzIiwgc2VpX2NsYXNzID09IDcgfiAidW5jbGFzc2lmaWVkIikpICU+JSBtdXRhdGUoc21va2luZ19saXN0TmV3ID0gY2FzZV93aGVuKHNtb2tpbmdfc3RhdHVzID09IDAgfiAibm9uX3Ntb2tlciIsIHNtb2tpbmdfc3RhdHVzID09IDEgIH4gImZvcm1lclNtb2tlciIsIHNtb2tpbmdfc3RhdHVzID09IDIgIH4gImN1cnJlbnRTbW9rZXIiKSkKCiMgcGxvdCB0aGUgcmVzdWx0cwpwcm9wX3NlaV93X3AgPC0gZ2dwbG90KHByb3Bfc2VpX3csIGFlcyh4ID0gc2VpQ2xhc3NfbmV3LCB5ID0gcHJvYikpICArIGdlb21fZXJyb3JiYXIoIGFlcyh5bWluID0gcTA1LCB5bWF4ID0gcTk3NSwgY29sb3IgPSBzbW9raW5nX2xpc3ROZXcpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuMyksIHdpZHRoID0gMC4yKSArIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gc21va2luZ19saXN0TmV3KSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjMpKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMDBBRkJCIiwgIiNFN0I4MDAiLCcjOTk5OTk5JykpICsgdGhlbWVfY2xhc3NpYygpICsgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSB7c3RyaW5ncjo6c3RyX3dyYXAoeCwgd2lkdGggPSA4KX0pCgpwcm9wX3NlaV93X3AKYGBgCgojIyBhbnlfc21wIHdpdGggc2VpX2NsYXNzIGFuZCBzbW9raW5nX3N0YXR1cyAKYGBge3IgY3BxdWVyeXRhYmxlQW55X3NtcCwgY2FjaGU9VFJVRX0KcHJvcF9zZWlfYXMgPC0gY3BxX2VmZmVfbW9kaWYoLmRhdGEgPSBkYXRhX21vZGVsaW5nLCB2YXJzID0gZWZmZV9tb2RpZl92YXJzLCBvdXRjb21lID0gImFueV9zbXAiLCBzdGF0ZSA9ICIxIiwgbW9kZWwgPSBhdmcuc2ltcGxlcl9taWNlX2hjLCByZXBlYXRzID0gMjAwMDAwKQoKIyBBZGQgdGhlIG5hbWVzIApwcm9wX3NlaV9hcyA8LSBwcm9wX3NlaV9hcyAlPiUgbXV0YXRlKHNlaUNsYXNzX25ldyA9IGNhc2Vfd2hlbihzZWlfY2xhc3MgPT0gMCB+ICJQcm9mZXNzaW9uYWxzIGFuZCBleGVjdXRpdmVzIiwgc2VpX2NsYXNzID09IDEgfiAiTWFudWFsIHdvcmsgaW4gaW5kdXN0cnkiLCBzZWlfY2xhc3MgPT0gMiB+ICJNYW51YWwgd29yayBpbiBzZXJ2aWNlIiwgc2VpX2NsYXNzID09IDMgfiAiQXNzaXN0YW50IE5vbi1tYW51YWwgZW1wbG95ZWVzIiwgc2VpX2NsYXNzID09IDQgfiAiSW50ZXJtZWRpYXRlIE5vbi1tYW51YWwgZW1wbG95ZWVzIiwgc2VpX2NsYXNzID09IDUgfiAiU2VsZi1lbXBsb3llZCBOb24tcHJvZmVzc2lvbmFscyIsIHNlaV9jbGFzcyA9PSA2IH4gInN0dWRlbnRzIGFuZCBob3VzZXdpdmVzIiwgc2VpX2NsYXNzID09IDcgfiAidW5jbGFzc2lmaWVkIikpICU+JSBtdXRhdGUoc21va2luZ19saXN0TmV3ID0gY2FzZV93aGVuKHNtb2tpbmdfc3RhdHVzID09IDAgfiAibm9uX3Ntb2tlciIsIHNtb2tpbmdfc3RhdHVzID09IDEgIH4gImZvcm1lclNtb2tlciIsIHNtb2tpbmdfc3RhdHVzID09IDIgIH4gImN1cnJlbnRTbW9rZXIiKSkKCiMgcGxvdCB0aGUgcmVzdWx0cwpwcm9wX3NlaV9hc19wIDwtIGdncGxvdChwcm9wX3NlaV9hcywgYWVzKHggPSBzZWlDbGFzc19uZXcsIHkgPSBwcm9iKSkgICsgZ2VvbV9lcnJvcmJhciggYWVzKHltaW4gPSBxMDUsIHltYXggPSBxOTc1LCBjb2xvciA9IHNtb2tpbmdfbGlzdE5ldyksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMC4zKSwgd2lkdGggPSAwLjIpICsgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBzbW9raW5nX2xpc3ROZXcpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuMykpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiMwMEFGQkIiLCAiI0U3QjgwMCIsJyM5OTk5OTknKSkgKyB0aGVtZV9jbGFzc2ljKCkgKyBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHtzdHJpbmdyOjpzdHJfd3JhcCh4LCB3aWR0aCA9IDgpfSkKCnByb3Bfc2VpX2FzX3AKYGBgCgojIyBhbGxlX2FzdGhtYSB3aXRoIHNlaV9jbGFzcyBhbmQgc21va2luZ19zdGF0dXMgCmBgYHtyIGNwcXVlcnl0YWJsZUFueV9hbGxlcmd5YXN0aG1hLCBjYWNoZT1UUlVFfQpwcm9wX3NlaV9hYXMgPC0gY3BxX2VmZmVfbW9kaWYoLmRhdGEgPSBkYXRhX21vZGVsaW5nLCB2YXJzID0gZWZmZV9tb2RpZl92YXJzLCBvdXRjb21lID0gImFsbGVfYXN0aG1hIiwgc3RhdGUgPSAiMSIsIG1vZGVsID0gYXZnLnNpbXBsZXJfbWljZV9oYywgcmVwZWF0cyA9IDIwMDAwMCkKCiMgQWRkIHRoZSBuYW1lcyAKcHJvcF9zZWlfYWFzIDwtIHByb3Bfc2VpX2FhcyAlPiUgbXV0YXRlKHNlaUNsYXNzX25ldyA9IGNhc2Vfd2hlbihzZWlfY2xhc3MgPT0gMCB+ICJQcm9mZXNzaW9uYWxzIGFuZCBleGVjdXRpdmVzIiwgc2VpX2NsYXNzID09IDEgfiAiTWFudWFsIHdvcmsgaW4gaW5kdXN0cnkiLCBzZWlfY2xhc3MgPT0gMiB+ICJNYW51YWwgd29yayBpbiBzZXJ2aWNlIiwgc2VpX2NsYXNzID09IDMgfiAiQXNzaXN0YW50IE5vbi1tYW51YWwgZW1wbG95ZWVzIiwgc2VpX2NsYXNzID09IDQgfiAiSW50ZXJtZWRpYXRlIE5vbi1tYW51YWwgZW1wbG95ZWVzIiwgc2VpX2NsYXNzID09IDUgfiAiU2VsZi1lbXBsb3llZCBOb24tcHJvZmVzc2lvbmFscyIsIHNlaV9jbGFzcyA9PSA2IH4gInN0dWRlbnRzIGFuZCBob3VzZXdpdmVzIiwgc2VpX2NsYXNzID09IDcgfiAidW5jbGFzc2lmaWVkIikpICU+JSBtdXRhdGUoc21va2luZ19saXN0TmV3ID0gY2FzZV93aGVuKHNtb2tpbmdfc3RhdHVzID09IDAgfiAibm9uX3Ntb2tlciIsIHNtb2tpbmdfc3RhdHVzID09IDEgIH4gImZvcm1lclNtb2tlciIsIHNtb2tpbmdfc3RhdHVzID09IDIgIH4gImN1cnJlbnRTbW9rZXIiKSkKCiMgcGxvdCB0aGUgcmVzdWx0cwpwcm9wX3NlaV9hYXNfcCA8LSBnZ3Bsb3QocHJvcF9zZWlfYWFzLCBhZXMoeCA9IHNlaUNsYXNzX25ldywgeSA9IHByb2IpKSAgKyBnZW9tX2Vycm9yYmFyKCBhZXMoeW1pbiA9IHEwNSwgeW1heCA9IHE5NzUsIGNvbG9yID0gc21va2luZ19saXN0TmV3KSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjMpLCB3aWR0aCA9IDAuMikgKyBnZW9tX3BvaW50KGFlcyhjb2xvciA9IHNtb2tpbmdfbGlzdE5ldyksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMC4zKSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiIzAwQUZCQiIsICIjRTdCODAwIiwnIzk5OTk5OScpKSArIHRoZW1lX2NsYXNzaWMoKSArIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkge3N0cmluZ3I6OnN0cl93cmFwKHgsIHdpZHRoID0gOCl9KQoKcHJvcF9zZWlfYWFzX3AKYGBgCgojIyBub2FsbGVfYXN0aG1hIHdpdGggc2VpX2NsYXNzIGFuZCBzbW9raW5nX3N0YXR1cyAKYGBge3IgY3BxdWVyeXRhYmxlQW55Tm9hbGxlQXN0aG1hLCBjYWNoZT1UUlVFLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMn0KcHJvcF9zZWlfbmFhcyA8LSBjcHFfZWZmZV9tb2RpZiguZGF0YSA9IGRhdGFfbW9kZWxpbmcsIHZhcnMgPSBlZmZlX21vZGlmX3ZhcnMsIG91dGNvbWUgPSAibm9hbGxlX2FzdGhtYSIsIHN0YXRlID0gIjEiLCBtb2RlbCA9IGF2Zy5zaW1wbGVyX21pY2VfaGMsIHJlcGVhdHMgPSAyMDAwMDApCgojIEFkZCB0aGUgbmFtZXMgCnByb3Bfc2VpX25hYXMgPC0gcHJvcF9zZWlfbmFhcyAlPiUgbXV0YXRlKHNlaUNsYXNzX25ldyA9IGNhc2Vfd2hlbihzZWlfY2xhc3MgPT0gMCB+ICJQcm9mZXNzaW9uYWxzIGFuZCBleGVjdXRpdmVzIiwgc2VpX2NsYXNzID09IDEgfiAiTWFudWFsIHdvcmsgaW4gaW5kdXN0cnkiLCBzZWlfY2xhc3MgPT0gMiB+ICJNYW51YWwgd29yayBpbiBzZXJ2aWNlIiwgc2VpX2NsYXNzID09IDMgfiAiQXNzaXN0YW50IE5vbi1tYW51YWwgZW1wbG95ZWVzIiwgc2VpX2NsYXNzID09IDQgfiAiSW50ZXJtZWRpYXRlIE5vbi1tYW51YWwgZW1wbG95ZWVzIiwgc2VpX2NsYXNzID09IDUgfiAiU2VsZi1lbXBsb3llZCBOb24tcHJvZmVzc2lvbmFscyIsIHNlaV9jbGFzcyA9PSA2IH4gInN0dWRlbnRzIGFuZCBob3VzZXdpdmVzIiwgc2VpX2NsYXNzID09IDcgfiAidW5jbGFzc2lmaWVkIikpICU+JSBtdXRhdGUoc21va2luZ19saXN0TmV3ID0gY2FzZV93aGVuKHNtb2tpbmdfc3RhdHVzID09IDAgfiAibm9uX3Ntb2tlciIsIHNtb2tpbmdfc3RhdHVzID09IDEgIH4gImZvcm1lclNtb2tlciIsIHNtb2tpbmdfc3RhdHVzID09IDIgIH4gImN1cnJlbnRTbW9rZXIiKSkKCiMgcGxvdCB0aGUgcmVzdWx0cwpwcm9wX3NlaV9uYWFzX3AgPC0gZ2dwbG90KHByb3Bfc2VpX25hYXMsIGFlcyh4ID0gc2VpQ2xhc3NfbmV3LCB5ID0gcHJvYikpICArIGdlb21fZXJyb3JiYXIoIGFlcyh5bWluID0gcTA1LCB5bWF4ID0gcTk3NSwgY29sb3IgPSBzbW9raW5nX2xpc3ROZXcpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuMyksIHdpZHRoID0gMC4yKSArIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gc21va2luZ19saXN0TmV3KSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjMpKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMDBBRkJCIiwgIiNFN0I4MDAiLCcjOTk5OTk5JykpICsgdGhlbWVfY2xhc3NpYygpICsgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSB7c3RyaW5ncjo6c3RyX3dyYXAoeCwgd2lkdGggPSA4KX0pCgpwcm9wX3NlaV9uYWFzX3AKYGBgCgojIENvbmRpdGlvbmFsIFByb2JhYmlsaXR5IERpc3RyaWJ1dGlvbnMgZm9yIGVmZmVjdCBtb2RpZmljYXRpb24gb2YgZWR1Y2F0aW9uIHZhciB3aXRoIHNtb2tpbmcgey50YWJzZXR9CgojIyBjX2FzdGhtYSB3aXRoIGVkdWNhdGlvbiBhbmQgc21va2luZ19zdGF0dXMgCmBgYHtyIGNwcXVlcnlfdGFibGVfZWR1LCBjYWNoZT1UUlVFLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMn0KZWZmZV9tb2RpZl92YXJzX2VkdSA8LSBjb2xuYW1lcyhkYXRhX21vZGVsaW5nICU+JSBzZWxlY3QoZWR1Y2F0aW9uLCBzbW9raW5nX3N0YXR1cykpIAojIGdldCB0aGUgY3AKcHJvcF9lZHUgPC0gY3BxX2VmZmVfbW9kaWYoLmRhdGEgPSBkYXRhX21vZGVsaW5nLCB2YXJzID0gZWZmZV9tb2RpZl92YXJzX2VkdSwgb3V0Y29tZSA9ICJjX2FzdGhtYSIsIHN0YXRlID0gIjEiLCBtb2RlbCA9IGF2Zy5zaW1wbGVyX21pY2VfaGMsIHJlcGVhdHMgPSAyMDAwMDApCiMgZ2V0IHRoZSBwbG90CnByb3BfZWR1X3AgPC0gZ2V0X2NwcV9wbG90KHJlc19kYXRhID0gcHJvcF9lZHUsIGVmZmVfbW9kaWZfdmFycyA9IGVmZmVfbW9kaWZfdmFyc19lZHUsIG9yaWdpbmFsX3Jhd19kYXRhID0gYXMuZGF0YS5mcmFtZShyYXdfZGF0YSksIGZpbmFsX2RhdGEgPSBkYXRhX21vZGVsaW5nKQoKcHJvcF9lZHVfcFtbMl1dCmBgYAoKIyMgd19hc3RobWEgd2l0aCBlZHVjYXRpb24gYW5kIHNtb2tpbmdfc3RhdHVzCgpgYGB7ciBjcHF1ZXJ5X3RhYmxlX2VkdV93LCBjYWNoZT1UUlVFLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMn0KcHJvcF9lZHVfdyA8LSBjcHFfZWZmZV9tb2RpZiguZGF0YSA9IGRhdGFfbW9kZWxpbmcsIHZhcnMgPSBlZmZlX21vZGlmX3ZhcnNfZWR1LCBvdXRjb21lID0gIndfYXN0aG1hIiwgc3RhdGUgPSAiMSIsIG1vZGVsID0gYXZnLnNpbXBsZXJfbWljZV9oYywgcmVwZWF0cyA9IDIwMDAwMCkKIyBnZXQgdGhlIHBsb3QKcHJvcF9lZHVfd19wIDwtIGdldF9jcHFfcGxvdChyZXNfZGF0YSA9IHByb3BfZWR1X3csIGVmZmVfbW9kaWZfdmFycyA9IGVmZmVfbW9kaWZfdmFyc19lZHUsIG9yaWdpbmFsX3Jhd19kYXRhID0gYXMuZGF0YS5mcmFtZShyYXdfZGF0YSksIGZpbmFsX2RhdGEgPSBkYXRhX21vZGVsaW5nKQpwcm9wX2VkdV93X3BbWzJdXQpgYGAKCiMjIGFueV9zbXAgd2l0aCBlZHVjYXRpb24gYW5kIHNtb2tpbmdfc3RhdHVzCmBgYHtyIGNwcXVlcnl0YWJsZUFueV9zbXBfZWR1LCBjYWNoZT1UUlVFLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMn0KcHJvcF9lZHVfYXMgPC0gY3BxX2VmZmVfbW9kaWYoLmRhdGEgPSBkYXRhX21vZGVsaW5nLCB2YXJzID0gZWZmZV9tb2RpZl92YXJzX2VkdSwgb3V0Y29tZSA9ICJhbnlfc21wIiwgc3RhdGUgPSAiMSIsIG1vZGVsID0gYXZnLnNpbXBsZXJfbWljZV9oYywgcmVwZWF0cyA9IDIwMDAwMCkKIyBnZXQgdGhlIHBsb3QKcHJvcF9zeWtfYXNfcCA8LSBnZXRfY3BxX3Bsb3QocmVzX2RhdGEgPSBwcm9wX2VkdV9hcywgZWZmZV9tb2RpZl92YXJzID0gZWZmZV9tb2RpZl92YXJzX2VkdSwgb3JpZ2luYWxfcmF3X2RhdGEgPSBhcy5kYXRhLmZyYW1lKHJhd19kYXRhKSwgZmluYWxfZGF0YSA9IGRhdGFfbW9kZWxpbmcpCnByb3Bfc3lrX2FzX3BbWzJdXQpgYGAKCiMjIGFsbGVfYXN0aG1hIHdpdGggZWR1Y2F0aW9uIGFuZCBzbW9raW5nX3N0YXR1cwpgYGB7ciBjcHF1ZXJ5dGFibGVBbnlfYWxsZXJneWFzdGhtYV9lZHUsIGNhY2hlPVRSVUUsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEyfQpwcm9wX2VkdV9hYXMgPC0gY3BxX2VmZmVfbW9kaWYoLmRhdGEgPSBkYXRhX21vZGVsaW5nLCB2YXJzID0gZWZmZV9tb2RpZl92YXJzX2VkdSwgb3V0Y29tZSA9ICJhbGxlX2FzdGhtYSIsIHN0YXRlID0gIjEiLCBtb2RlbCA9IGF2Zy5zaW1wbGVyX21pY2VfaGMsIHJlcGVhdHMgPSAyMDAwMDApCnByb3BfZWR1X2Fhc19wIDwtIGdldF9jcHFfcGxvdChyZXNfZGF0YSA9IHByb3BfZWR1X2FhcywgZWZmZV9tb2RpZl92YXJzID0gZWZmZV9tb2RpZl92YXJzX2VkdSwgb3JpZ2luYWxfcmF3X2RhdGEgPSBhcy5kYXRhLmZyYW1lKHJhd19kYXRhKSwgZmluYWxfZGF0YSA9IGRhdGFfbW9kZWxpbmcpCnByb3BfZWR1X2Fhc19wW1syXV0KYGBgCgoKIyMgbm9hbGxlX2FzdGhtYSB3aXRoIGVkdWNhdGlvbiBhbmQgc21va2luZ19zdGF0dXMKYGBge3IgY3BxdWVyeXRhYmxlQW55Tm9hbGxlQXN0aG1hX2VkdSwgY2FjaGU9VFJVRSwgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTJ9CnByb3BfZWR1X25hYXMgPC0gY3BxX2VmZmVfbW9kaWYoLmRhdGEgPSBkYXRhX21vZGVsaW5nLCB2YXJzID0gZWZmZV9tb2RpZl92YXJzX2VkdSwgb3V0Y29tZSA9ICJub2FsbGVfYXN0aG1hIiwgc3RhdGUgPSAiMSIsIG1vZGVsID0gYXZnLnNpbXBsZXJfbWljZV9oYywgcmVwZWF0cyA9IDIwMDAwMCkKcHJvcF9lZHVfbmFhc19wIDwtIGdldF9jcHFfcGxvdChyZXNfZGF0YSA9IHByb3BfZWR1X25hYXMsIGVmZmVfbW9kaWZfdmFycyA9IGVmZmVfbW9kaWZfdmFyc19lZHUsIG9yaWdpbmFsX3Jhd19kYXRhID0gYXMuZGF0YS5mcmFtZShyYXdfZGF0YSksIGZpbmFsX2RhdGEgPSBkYXRhX21vZGVsaW5nKQpwcm9wX2VkdV9uYWFzX3BbWzJdXQpgYGAKCiMgQ29uZGl0aW9uYWwgUHJvYmFiaWxpdHkgRGlzdHJpYnV0aW9ucyBmb3IgZWZmZWN0IG1vZGlmaWNhdGlvbiBvZiBzeWtfY2xhc3MgdmFyIHdpdGggc21va2luZyB7LnRhYnNldH0KCiMjIGNfYXN0aG1hIHdpdGggc3lrX2NsYXNzIGFuZCBzbW9raW5nX3N0YXR1cyAKYGBge3IgY3BxdWVyeV90YWJsZV9zeWssIGNhY2hlPVRSVUUsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEyfQplZmZlX21vZGlmX3ZhcnNfc3lrIDwtIGNvbG5hbWVzKGRhdGFfbW9kZWxpbmcgJT4lIHNlbGVjdChzeWtfY2xhc3MsIHNtb2tpbmdfc3RhdHVzKSkgCiMgZ2V0IHRoZSBjcApwcm9wX3N5ayA8LSBjcHFfZWZmZV9tb2RpZiguZGF0YSA9IGRhdGFfbW9kZWxpbmcsIHZhcnMgPSBlZmZlX21vZGlmX3ZhcnNfc3lrLCBvdXRjb21lID0gImNfYXN0aG1hIiwgc3RhdGUgPSAiMSIsIG1vZGVsID0gYXZnLnNpbXBsZXJfbWljZV9oYywgcmVwZWF0cyA9IDIwMDAwMCkKIyBnZXQgdGhlIHBsb3QKcHJvcF9zeWtfcCA8LSBnZXRfY3BxX3Bsb3QocmVzX2RhdGEgPSBwcm9wX3N5aywgZWZmZV9tb2RpZl92YXJzID0gZWZmZV9tb2RpZl92YXJzX3N5aywgb3JpZ2luYWxfcmF3X2RhdGEgPSBhcy5kYXRhLmZyYW1lKHJhd19kYXRhKSwgZmluYWxfZGF0YSA9IGRhdGFfbW9kZWxpbmcpCgpwcm9wX3N5a19wW1syXV0KYGBgCgojIyB3X2FzdGhtYSB3aXRoIHN5a19jbGFzcyBhbmQgc21va2luZ19zdGF0dXMKCmBgYHtyIGNwcXVlcnlfdGFibGVfc3lrX3csIGNhY2hlPVRSVUUsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEyfQpwcm9wX3N5a193IDwtIGNwcV9lZmZlX21vZGlmKC5kYXRhID0gZGF0YV9tb2RlbGluZywgdmFycyA9IGVmZmVfbW9kaWZfdmFyc19zeWssIG91dGNvbWUgPSAid19hc3RobWEiLCBzdGF0ZSA9ICIxIiwgbW9kZWwgPSBhdmcuc2ltcGxlcl9taWNlX2hjLCByZXBlYXRzID0gMjAwMDAwKQojIGdldCB0aGUgcGxvdApwcm9wX3N5a193X3AgPC0gZ2V0X2NwcV9wbG90KHJlc19kYXRhID0gcHJvcF9zeWtfdywgZWZmZV9tb2RpZl92YXJzID0gZWZmZV9tb2RpZl92YXJzX3N5aywgb3JpZ2luYWxfcmF3X2RhdGEgPSBhcy5kYXRhLmZyYW1lKHJhd19kYXRhKSwgZmluYWxfZGF0YSA9IGRhdGFfbW9kZWxpbmcpCnByb3Bfc3lrX3dfcFtbMl1dCmBgYAoKIyMgYW55X3NtcCB3aXRoIHN5a19jbGFzcyBhbmQgc21va2luZ19zdGF0dXMKYGBge3IgY3BxdWVyeXRhYmxlQW55X3NtcF9zeWssIGNhY2hlPVRSVUUsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEyfQpwcm9wX3N5a19hcyA8LSBjcHFfZWZmZV9tb2RpZiguZGF0YSA9IGRhdGFfbW9kZWxpbmcsIHZhcnMgPSBlZmZlX21vZGlmX3ZhcnNfc3lrLCBvdXRjb21lID0gImFueV9zbXAiLCBzdGF0ZSA9ICIxIiwgbW9kZWwgPSBhdmcuc2ltcGxlcl9taWNlX2hjLCByZXBlYXRzID0gMjAwMDAwKQojIGdldCB0aGUgcGxvdApwcm9wX3N5a19hc19wIDwtIGdldF9jcHFfcGxvdChyZXNfZGF0YSA9IHByb3Bfc3lrX2FzLCBlZmZlX21vZGlmX3ZhcnMgPSBlZmZlX21vZGlmX3ZhcnNfc3lrLCBvcmlnaW5hbF9yYXdfZGF0YSA9IGFzLmRhdGEuZnJhbWUocmF3X2RhdGEpLCBmaW5hbF9kYXRhID0gZGF0YV9tb2RlbGluZykKcHJvcF9zeWtfYXNfcFtbMl1dCmBgYAoKIyMgYWxsZV9hc3RobWEgd2l0aCBzeWtfY2xhc3MgYW5kIHNtb2tpbmdfc3RhdHVzCmBgYHtyIGNwcXVlcnl0YWJsZUFueV9hbGxlcmd5YXN0aG1hX3N5aywgY2FjaGU9VFJVRSwgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTJ9CnByb3Bfc3lrX2FhcyA8LSBjcHFfZWZmZV9tb2RpZiguZGF0YSA9IGRhdGFfbW9kZWxpbmcsIHZhcnMgPSBlZmZlX21vZGlmX3ZhcnNfc3lrLCBvdXRjb21lID0gImFsbGVfYXN0aG1hIiwgc3RhdGUgPSAiMSIsIG1vZGVsID0gYXZnLnNpbXBsZXJfbWljZV9oYywgcmVwZWF0cyA9IDIwMDAwMCkKcHJvcF9zeWtfYWFzX3AgPC0gZ2V0X2NwcV9wbG90KHJlc19kYXRhID0gcHJvcF9zeWtfYWFzLCBlZmZlX21vZGlmX3ZhcnMgPSBlZmZlX21vZGlmX3ZhcnNfc3lrLCBvcmlnaW5hbF9yYXdfZGF0YSA9IGFzLmRhdGEuZnJhbWUocmF3X2RhdGEpLCBmaW5hbF9kYXRhID0gZGF0YV9tb2RlbGluZykKcHJvcF9zeWtfYWFzX3BbWzJdXQpgYGAKCgojIyBub2FsbGVfYXN0aG1hIHdpdGggc3lrX2NsYXNzIGFuZCBzbW9raW5nX3N0YXR1cwpgYGB7ciBjcHF1ZXJ5dGFibGVBbnlOb2FsbGVBc3RobWFfc3lrLCBjYWNoZT1UUlVFLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMn0KcHJvcF9zeWtfbmFhcyA8LSBjcHFfZWZmZV9tb2RpZiguZGF0YSA9IGRhdGFfbW9kZWxpbmcsIHZhcnMgPSBlZmZlX21vZGlmX3ZhcnNfc3lrLCBvdXRjb21lID0gIm5vYWxsZV9hc3RobWEiLCBzdGF0ZSA9ICIxIiwgbW9kZWwgPSBhdmcuc2ltcGxlcl9taWNlX2hjLCByZXBlYXRzID0gMjAwMDAwKQpwcm9wX3N5a19uYWFzX3AgPC0gZ2V0X2NwcV9wbG90KHJlc19kYXRhID0gcHJvcF9zeWtfbmFhcywgZWZmZV9tb2RpZl92YXJzID0gZWZmZV9tb2RpZl92YXJzX3N5aywgb3JpZ2luYWxfcmF3X2RhdGEgPSBhcy5kYXRhLmZyYW1lKHJhd19kYXRhKSwgZmluYWxfZGF0YSA9IGRhdGFfbW9kZWxpbmcpCnByb3Bfc3lrX25hYXNfcFtbMl1dCmBgYAo=